package com.lse_api.utils;


import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * 代码生成器演示
 *
 * @author 祁雪
 * </p>
 */
public class MpGenerator {

    // 文件生成地址

    private static String outpath = "D:\\project\\IdeaWork/lse_api_boot/src/main/java/";

    private static String author = "祁雪";
    // 数据库驱动 地址

    private static String driverName = "com.mysql.jdbc.Driver";
    // 数据库用户名

    private static String user = "root";
    // 数据库密码

    private static String pass = "wang";
    // 数据库名称

    private static String databaseName = "";
    // 数据库连接地址

    private static String url = "jdbc:mysql://127.0.0.1:3306/" + databaseName + "?useUnicode=true&characterEncoding=utf-8&autoReconnect=true";
    // 需要生成java文件的表数组

    private static String[] tableNames = new String[]{""};
    // java文件存放地址 父包路径

    private static String parentPath = "com.lse_api";
    // 异常处理类 地址

    private static String exceptionPath = "com.lse_api.exception.LseException";

    /**
     * 开始执行代码生成
     *
     * @param outpath
     * @param author
     * @param driverName
     * @param user
     * @param pass
     * @param databaseName
     * @param url
     * @param tableNames
     * @param parentPath
     * @param exceptionPath
     */
    public static void MpGeneratorGo(String outpath, String author, String driverName,
                                     String user, String pass, String databaseName, String url,
                                     String[] tableNames, String parentPath, String exceptionPath) {
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir(outpath);
        gc.setFileOverride(false);//是否覆盖已有文件
        gc.setActiveRecord(false);
        gc.setEnableCache(false);// XML 二级缓存
        gc.setBaseResultMap(true);// XML ResultMap
        gc.setBaseColumnList(true);// XML columList
        gc.setAuthor(author);

        // 自定义文件命名，注意 %s 会自动填充表实体属性！
        gc.setMapperName("%sMapper");
        gc.setXmlName("%sMapper");
        gc.setServiceName("%sService");
        gc.setServiceImplName("%sServiceImpl");
        gc.setControllerName("%sController");

        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL);
        dsc.setTypeConvert(new MySqlTypeConvert() {
            @Override
            public DbColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
                System.out.println("转换类型：" + fieldType);
                //将数据库中datetime转换成date
                if (fieldType.toLowerCase().contains("datetime")) {
                    return DbColumnType.DATE;
                }
                return (DbColumnType) super.processTypeConvert(globalConfig, fieldType);
            }

            /*@Override
            public DbColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
                System.out.println("转换类型：" + fieldType);
                return (DbColumnType) super.processTypeConvert(globalConfig, fieldType);
            }*/
        });
        dsc.setDriverName(driverName);
        dsc.setUsername(user);
        dsc.setPassword(pass);
        dsc.setUrl(url);
        mpg.setDataSource(dsc);

        //         策略配置
        StrategyConfig strategy = new StrategyConfig();
        // 全局大写命名 ORACLE 注意
        // strategy.setCapitalMode(true);
        //strategy.setTablePrefix(new String[] { "sys_", "ql_" });// 此处可以修改为您的表前缀
        //strategy.setTablePrefix(new String[] {"ejar_","gc_"});
        strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略 取消下划线并下划线后第一个字母大写
        // strategy.setNaming(NamingStrategy.nochange);// 表名生成策略 原样生成
        strategy.setInclude(tableNames); // 需要生成的表
        // strategy.setExclude(new String[]{"test"}); // 排除生成的表
        strategy.setSuperControllerClass(exceptionPath);
/*      // 【实体】是否生成字段常量（默认 false）
         public static final String ID = "test_id";
         strategy.setEntityColumnConstant(true);
        // 【实体】是否为构建者模型（默认 false）
         public User setName(String name) {this.name = name; return this;}
         strategy.setEntityBuilderModel(true);*/
        mpg.setStrategy(strategy);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent(parentPath);
        pc.setController("control");
        pc.setEntity("entity");
        pc.setService("service");
        pc.setServiceImpl("service.impl");
        pc.setMapper("mapper");
        pc.setXml("mapper.xml");
        mpg.setPackageInfo(pc);

        // 注入自定义配置，可以在 VM 中使用 cfg.abc 【可无】
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("key", this.getConfig().getGlobalConfig().getAuthor() + "-done");
                this.setMap(map);
            }
        };

        mpg.setCfg(cfg);

        // 执行生成
        mpg.execute();

        // 打印注入设置【可无】
        System.err.println(mpg.getCfg().getMap().get("key"));


    }

    public static void main(String[] args) {

        databaseName = "lse_api";
        url = "jdbc:mysql://127.0.0.1:3306/" + databaseName + "?useUnicode=true&characterEncoding=utf-8&autoReconnect=true";
        tableNames = new String[]{
                "lse_permissions",
                "lse_role",
                "lse_role_permissions",
                "lse_user_role"
        };

        MpGeneratorGo(outpath, author, driverName,
                user, pass, databaseName, url,
                tableNames, parentPath, exceptionPath);

    }

}
